package com.cskaoyan.javase.method._0introduction;

/**
 * 使用method的语法来优化,复用代码
 *
 * 一般情况下，定义一个方法是以下语法结构：
 * [修饰符列表] 返回值类型 方法名 (形式参数列表){
 *   // 方法体
 * }
 * 两个概念:
 *      1.方法头(也叫方法的声明)
 *          指的是"[修饰符列表] 返回值类型 方法名 (形式参数列表)" 合起来
 *
 *      2.方法的签名: 指的是"方法名 (形式参数列表)"
 *          方法的签名用于唯一的指代一个方法
 *
 *
 * 逐一解释:
 * 1.修饰符列表,指的是一系列可以用来修饰方法的关键字,组成的列表
 *      这里我们先不谈修饰符列表,只需要记住以下两点:
 *          a.目前我们定义方法,保持修饰符列表和main方法一致,为"public statics"
 *          b.方法的修饰符列表并不是一定要有,完全可以什么都不写,保持空着.
 *
 * 2.返回值类型,指的是方法给出返回值的数据类型,可以是基本数据类型,也可以是引用数据类型.
 *      返回值: 方法在实现某个功能时,可能会给出一个结果,这个结果就是返回值
 *
 * 3.方法名,标识符的一种,应该遵循小驼峰式的命名规范,使用合法的英文单词,最好"见名知意"
 *      方法一般是用来完成一系列操作的,所以建议方法名中带有动词,表示操作
 *      比如一个求和的方法,我们就可以叫"sum"
 *      一个求最大值的方法,就叫"getMaxValue"
 *      一个求三个数最小值的方法,就叫"getMinValueOfThreeNum"
 *      方法名不要害怕起的很长,应该担心方法的名字不足以描述方法的功能
 *
 * 4.形式参数列表,是由形式参数组成的一个列表.
 *      方法可能需要传入一些参数,而参数的个数,参数的数据类型,都需要依赖形式参数来界定
 *      形式参数: 用来告诉方法的调用者,调用该方法需要传入几个参数,以及参数的数据类型
 *              所以形式参数(简称形参),语法是: 数据类型 形参名
 *      多个形参之间用","隔开,当然方法也完全可以没有参数,是一个无参方法,形参列表是空的.
 *
 *      那么:
 *      形式参数是不是一个真正意义上的参数?
 *      形参不是一个真正意义上的参数,它更像一个占位符,用来确保方法按照预期来调用.
 *      形式参数的作用范围是什么?
 *      形参是仅在方法内部生效的一个局部变量,它在方法中,用来确保参数按照预期的代码去处理.
 *
 * 5.方法体,就是方法实现特定功能的代码集合,当然方法体保持空着也没问题.
 *
 *
 * 以上是方法定义的语法,知道语法后,还需要知道方法定义的位置:
 *      方法必须定义在类体中,而且方法是不能嵌套定义的
 *      方法必须定义在其它方法的外部
 *
 * 如果方法通过返回值类型,明确了方法需要一个返回值,那么方法就必须给出这个返回值
 * 否者就会编译报错
 * 在方法中指出返回值的语法:
 *      return + 值;
 * 这个值只要满足返回值类型就可以了,可以直接是一个常量,也可以是一个变量,当然也可以是一个表达式.
 *
 * 方法定义完毕后,需要调用方法:
 *      1.方法不调用不执行,单单定义方法,该方法是不起作用的,必须主动调用它
 *      2.main方法是程序的入口方法,所有的其它代码,要想被执行
 *          那么必须直接或者间接在main方法中被调用
 *
 * 方法的调用:
 *      在同一个类中,有static修饰的方法之间,是可以直接用"方法名"来互相调用的
 *      当然在调用时,必须明确给出该方法调用需要的参数,称之为"实际参数"(简称实参)
 *      实参是一个真正意义上的参数,是一个值,可以是常量,变量,也可以是表达式.
 *      只要实参能够对应形参就可以了.
 *
 *      如果方法有返回值,那么建议在调用方法时,处理这个返回值
 *
 * 处理方法的调用就是处理方法的返回值!!!方法的返回值能够进行的处理,方法的调用都可以.
 *
 * 注意事项:
 *      1.一个类之中的多个方法是平行的关系,它们之间是不会互相影响的(当然如果互相调用了除外)
 *      2.方法的定义位置,和方法的调用结果,完全没有没有关系
 *
 * @since 14:52
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class NewDemo {


    public static void main(String[] args) {
        System.out.println(sumTwoIntValue(100, 200));
        int num1 = 100;
        int num2 = 200;
        // Result of 'NewDemo.sumTwoIntValue()' is ignored
        int result = sumTwoIntValue(num1, num2);
        System.out.println(result);

        System.out.println(sumTwoIntValue(1, 1) + 10);
        System.out.println(sumTwoIntValue(1, 1) / 10);
        System.out.println(sumTwoIntValue(1, 1) * 10);

        // 操作方法的调用,就是操作方法的返回值
        System.out.println(getStr());
        System.out.println(getStr() + " world!");
        // getStr() - 100;
        // getStr()/ 100
    }


    // 需求是: 求两个int类型数据的和
    public static int sumTwoIntValue(int num1, int num2) {
        // Missing return statement
        // Local variable 'sum' is redundant
        // int sum = num1 + num2;
        // return sum;
        return num1 + num2;
    }


    public static String getStr() {
        return "hello";
    }


}
